/**
 * BokeMecn Copyright (c) 2014-2014 All Rights Reserved.
 */
package com.dl.dw;

import android.content.Context;
import android.util.Log;

import java.lang.Thread.UncaughtExceptionHandler;

/** 捕获异常传递到后台 */
public final class FinalCrashHandler implements UncaughtExceptionHandler {
    /** CrashHandler实例 */
    private static FinalCrashHandler INSTANCE;
    /** 系统默认的UncaughtException处理类 */
    private UncaughtExceptionHandler mDefaultHandler;
    private Context mContext;

    /** 程序的Context对象 */
    // private Context mContext;

    /** 保证只有一个CrashHandler实例 */
    private FinalCrashHandler() {
    }

    /** 获取CrashHandler实例 ,单例模式 */
    public static FinalCrashHandler getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new FinalCrashHandler();
        }
        return INSTANCE;
    }

    /**
     * 初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器
     *
     * @param context
     */
    public void init(Context context) {
        mContext = context;
        //        mQueue = Volley.newRequestQueue(context);
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /** 当UncaughtException发生时会转入该函数来处理 */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        Log.e("boom!!", ex.getMessage());

        StringBuilder sbException = new StringBuilder();
        for (StackTraceElement ele : ex.getStackTrace()) {
            sbException.append(ele.getClassName() + ":" + ele.getMethodName() + ":" + ele.getFileName() + ":  " + ele.getLineNumber() + "\n");
        }
        UploadErrorMessage(ex.getMessage() + "\n堆栈信息：\n" + sbException);

        if (mDefaultHandler != null) {
            // 如果用户没有处理则让系统默认的异常处理器来处理
            mDefaultHandler.uncaughtException(thread, ex);
        } else { // 如果自己处理了异常，则不会弹出错误对话框，则需要手动退出app
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(0);
        }
    }

    /**
     * 上传错误信息到后台
     *
     * @param message
     */
    private void UploadErrorMessage(final String message) {
        //暂时先写本地
//        FileIOUtils.writeFileFromString(UITools.getTodayErrorFilePath(), message);
    }
}
